hive入门 |
您所在的位置:网站首页 › hive中文手册 下载 › hive入门 |
前提准备
由于Apache Hive是一款基于Hadoop的数据仓库软件,通常部署运行在Linux系统之上。因此不管使用何种方式配置Hive Metastore,必须要先保证服务器的基础环境正常,Hadoop集群健康可用。 1.服务器的基础环境 集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装2.Hadoop集群健康可用 启动Hive之前必须先启动Hadoop集群。特别要注意,需等待HDFS安全模式关闭之后再启动运行ive。 Hive不是分布式安装运行的软件,其分布式的特性主要借由Hadoop完成。包括分布式存储、分布式计算。 配置Hive操作Hadoop权限 vi /opt/apps/hadoop-3.1.1/etc/hadoop/core-site.xml dfs.permissions.enabled false hadoop.proxyuser.root.hosts * hadoop.proxyuser.root.groups * 3.MySQL数据库准备 因为我们使用远程连接模式,要把元数据存储到Mysql中.所以需要安装mysql并开启远程连接权限. Mysql安装我们已经安装完毕,没有安装详情参照Linux02课件. 这里直接开启远程权限 1.登录 mysql -uroot -proot 2.在mysql中设置允许简单密码 set global validate_password_policy=0; set global validate_password_length=1; 3.开放远程连接权限 grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; 4.刷新权限 flush privileges; 这样就开启成功,开启成功后可以在windows上用图形化工具连接一下查看是否成功 补充数据库修改密码命令 SET PASSWORD FOR 'root'@'linux01' = PASSWORD('root'); 2.3 上传解压 将资料中的apache-hive-3.1.2.tar.gz上传到linux01的/opt/apps文件夹 可以使用rz命令或者xftp工具 上传后进入到apps文件夹 进行解压 tar -zxvf apache-hive-3.1.2.tar.gz 解压后名称比较长 我们简单修改一下 mv apache-hive-3.1.2 hive-3.1.2 如果hadoop版本比较高需要解决Hadoop和hive中guava版本差异(我们用的hadoop版本是3.1.1不需要修改) 在hive的lib文件夹下 guava的jar包版本是19.0 而高版本的的hadoop的/opt/apps/hadoop-3.1.1/share/hadoop/common/lib 下的guava包是27.0 可以删除hive下的guava 将hadoop的复制过来 2.4 配置配置hive系统环境变量 让Hive命令可以在任意位置运行 vi /etc/profile export JAVA_HOME=/opt/apps/jdk1.8.0_191 export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_HOME=/opt/apps/hive-3.1.2 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin 添加完毕后别忘记 source /etc/profileHive总共有三种配置方式:内嵌模式,本地模式,远程模式. 三种方式主要区别在于Metastore是否需要单独启动,及Metadata存储在哪种数据库中.我们主要使用的是远程模式,这也是企业中使用的模式. 主要区别在于Metastare是不是需要单独启动? 内嵌模式和本地模式不需要单独启动 远程模式需要单独启动 Metadata元数据信息保存在哪里? 内嵌模式保存在hive内置数据库中Derby 本地模式和远程模式保存在mysql中2.4.1 内嵌模式(了解) 内嵌模式(Embedded Metastore )是metastore默认部署模式。 此种模式下,元数据存储在内置的Derby数据库,并且Derby数据库和metastore服务都嵌入在主HiveServer进程中,当启动HiveServer进程时,Derby和metastore都会启动。不需要额外起Metastore服务。 但是一次只能支持一个活动用户,适用于测试体验,不适用于生产环境。 具体配置(了解 不演示) #修改Hive环境变量文件 添加Hadoop_HOME cd /opt/apps/hive-3.1.2/conf mv hive-env.sh.template hive-env.sh vi hive-env.sh #在最后加上 export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.2/lib #初始化元数据 schematool -initSchema -dbType derby #启动hive服务 hive2.4.2 本地模式(了解) 本地模式(Local Metastore ) 下,Metastore服务与主HiveServer进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。metastore服务将通过JDBC与metastore数据库进行通信。本地模式采用外部数据库来存储元数据,推荐使用MySQL。 hive根据hive.metastore.uris参数值来判断,如果为空,则为本地模式。缺点是︰每启动一次hive服务,都内置启动了一个metastore。 本地模式特征就是∶需要安装数据库MySQL来存储元数据,但是不需要配置启动Metastore服务。 注意:Hive3版本需要用户手动进行元数据初始化动作。 具体配置(了解 不演示) #修改Hive环境变量文件 添加Hadoop_HOME cd /opt/apps/hive-3.1.2/conf mv hive-env.sh.template hive-env.sh vi hive-env.sh export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.2/lib 在/opt/apps/hive-3.1.2/lib下上传mysql驱动包 vi hive-site.xml javax.jdo.option.ConnectionURL jdbc:mysql://linux01:3306/hive?createDatabaseIfNotExist=true;useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword root hive.metastore.event.db.notification.api.auth false hive.metastore.schema.verification false 开启hive操作hadoop权限 见2.2 初始化元数据 schematool -initSchema -dbType mysql -verbos 启动服务 hive2.4.3 远程模式(重点) 远程模式(Remote Metastore )下,Metastore服务在其自己的单独JVM上运行,而不在HiveServer的JVM中运行。如果其他进程希望与Metastore服务器通信,则可以使用thrift Network API进行通信。 远程模式下,需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务。元数据也采用外部数据库来存储元数据,推荐使用MySQL。 在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。 具体配置(重要) 1.修改Hive环境变量文件 添加Hadoop_HOME #进入到hive下的conf文件夹 cd /opt/apps/hive-3.1.2/conf #将hive环境变量文件模版 改为可用文件 mv hive-env.sh.template hive-env.sh #在最后添加Hadoop_Home export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.2/lib shift: set nu 将第40行注释打开 export HADOOP_HEAPSIZE=10242.创建Hive的核心配置文件 进行配置 在hive下的conf文件夹下 直接vi一个hive-site.xml vi hive-site.xml javax.jdo.option.ConnectionURL jdbc:mysql://linux01:3306/hive?createDatabaseIfNotExist=true;useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword root hive.metastore.warehouse.dir /user/hive/warehouse hive.exec.scratchdir /user/hive/tmp hive.querylog.location /user/hive/log hive.server2.thrift.port 10000 hive.server2.thrift.bind.host linux01 hive.server2.webui.port 10002 hive.server2.long.polling.timeout 5000 hive.server2.enable.doAs true datanucleus.autoCreateSchema false datanucleus.fixedDatastore true hive.execution.engine mr hive.metastore.event.db.notification.api.auth false hive.metastore.schema.verification false hive.metastore.uris thrift://linux01:90833.开启hive操作hadoop的权限 已经配置过 见2.2 前提准备4.上传MySQL驱动包放入到Hive的lib文件夹下 Hive的lib包中默认没有mysql驱动的jar包.我们需要上传一个mysql的jdbc驱动jar包放入到hive的lib下. cd /opt/apps/hive-3.1.2/lib 使用rz命令上传我们之前用过的jdbc的jar包即可 2.5 hive初始化 将hive的原数据信息初始化到mysql中 用的是hive下bin中的schematool命令 我们配置了环境变量可以直接使用. schematool -initSchema -dbType mysql 最后出现 completed初始化成功 Initialization script completed schemaTool completed在mysql数据库中发现生成一个新的hive数据库 里面默认有74张表 , 说明hive初始化成功! 2.6 启动元数据服务 前台启动 hive --service metastore 如果使用前台启动需要克隆一个session来访问 或者使用ctrl+z挂起到后台 因为元数据服务会一直在前台运行 直接后台启动 hive --service metastore & 这种启动方式 会在后台启动 可以正常访问 但是如果退出终端 就会退出 nohup hive --service metastore & 这种方式 即使退出终端 服务也会继续运行 启动日志会在当前目录下的 nohup.out中 nohup hive --service metastore 1>/dev/null 2>1 & 这种方式将 启动日志 写入到黑洞 不显示任何内容 /dev/null :代表空设备文件 > :代表重定向到哪里,例如:echo "123" > /home/123.txt 1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 :表示stderr标准错误输出 & :表示等同于的意思,2>&1,表示2的输出重定向等同于1 1>/dev/null:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。 2>&1:接着,标准错误输出重定向标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 检查启动额端口 netstat -nltp | grep 9083 端口存在说明元数据服务启动成功 2.7 HIVE的命令行客户端Hive发展至今,总共历经了两代客户端工具。 第一代客户端( deprecated不推荐使用)︰$HIVE_HOME/bin/hive,是一个shellUtil。主要功能∶一是可用于以交互或批处理模式运行Hive查询;二是用于Hive相关服务的启动,比如metastore服务。 第二代客户端( recommended推荐使用)∶$HIVE_HOME/bin/beeline,是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。 本地访问 如果是在linux01上使用 先启动元数据服务 注意如果已经启动不能再次启动 会报错 nohup hive --service metastore & 启动后直接使用hive命令即可 进入后可以使用正常的SQL语句. 退出客户端的命令 exit; quit;远程访问 我们是远程连接模式是可以使用其他计算机来进行访问的. 如果使用其他计算机访问 首先这台计算机需要安装hive 上传解压 cd /opt/apps/hive-3.1.2/conf 配置hive-env.sh export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.2/lib vi hive-site.xml 需要在hive-site.xml中配置 元数据服务的地址 其他什么都不需要配置了 hive.metastore.uris thrift://linux01:9083 就可以直接访问 注意没有配置hive环境变量 需要到/opt/apps/hive-3.1.2/bin 下使用hive命令 ./hive 本地访问 先启动Metastore服务 如果已经启动可以忽视 nohup hive --service metastore & 然后才启动hiveserver2服务 端口号10000 在hive-site.xml中进行的配置 nohup hive --service hiveserver2 & 启动后可以使用netstat -nltp | grep 10000 来进行验证 检查10000端口 查看WEBUI页面http://linux01:10002/ 使用beeline命令 进入后输入相关连接的uri !connect jdbc:hive2://linux01:10000 需要输入用户名 root 密码为空 不输入 直接回车 退出命令 !quit 或者直接ctrl+c 可以使用 beeline -u jdbc:hive2://linux01:10000 -n root远程访问 使用其他计算机访问的话首先保证 linux01的Metastore和 hiveserver2都已经启动 上传 解压 不再多说 这里只需要配置 hive-env.sh export HADOOP_HOME=/opt/apps/hadoop-3.1.1 export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/opt/apps/hive-3.1.2/lib 由于不直接访问Metastore 所以不需要配置hive-site.xml 直接使用beeline正常访问即可2.7.3 非交互式操作(了解) 不进入到hive中 直接执hql语句或者hql文件 ,执行完毕后返回linux命令行 使用 –e 参数来直接执行hql的语句 hive -e "show databases;"使用 –f 参数通过指定文本文件来执行hql的语句 vi a.sql show databases; 执行sql文件 hive -f a.sql 执行sql文件 将执行结果写入到另一个文件中 hive -f a.sql > b.sql 2.8 Hive简单体验在Hive上可以直接写SQL语句,即使我们不会HQL也可以进行简单使用,比如建库,建表. create database hive01; use hive01; create table `temperature`( `id` int , `city` varchar(255), `tempera` double, `date` varchar(255) );当我们这样创建一张表的时候,mysql会存储对应的元数据信息. 有了张表后我们尝试向里面插入数据 INSERT INTO temperature VALUES (2,'beijing',37,'2022-07-20');通过执行的日志我们发现,这条语句会转换为MR程序运行,执行时间很长.如果使用mysql的话是毫秒级别就可以执行完,但是使用hive会发现要执行很长时间.(本地MR大概要几秒,如果提交到Yarn上要几十秒); 如果想配置yarn运行 在hadoop中 配置mapred-site.xml 添加 mapreduce.framework.name yarn 在执行insert + values操作的时候 虽然最终执行成功,结果正确。但是在执行日志中会出现如下的错误信息。 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask 此信息类似于计数器 用于告知用户插入数据的相关信息 但是不影响程序的正常执行。 如果报这个错误 可以设置两个参数 set hive.txn.stats.enabled=false set hive.stats.autogather=false通过这些操作我们可以得出几个结论: Hive SQL语法和标准SQL很类似,使得学习成本降低。 Hive底层是通过MapReduce执行的数据插入动作,所以速度慢。 如果大数据这么一条一条插入的话是非常不现实的,成本极高。 Hive应该具有自己特有的数据插入表方式,结构化文件映射成为表。 { 基本步骤 } 在HDFS上准备一个结构化的文件 根据文件中数据结构创建一张hive表 导入数据 *** 查询表中的数据 创建文件上传到hdfs vi temperature.txt; 1,beijing,37,2022-07-20 2,shanghai,40,2022-07-20 3,beijing,36,2022-07-21 4,shanghai,41,2022-07-21 hdfs dfs -put temperature.txt /建表 create table `temperature2`( `id` int , `city` varchar(255), `tempera` double, `date` varchar(255) ) row format delimited fields terminated by ','; -- 指定行的分隔方式 ,导入数据 load data inpath '/temperature.txt' into table temperature2 ;查询每日最高温度 select `date`,max(tempera) from temperature2 group by `date`; 结果 +-------------+-------+ | date | _c1 | +-------------+-------+ | 2022-07-20 | 40.0 | | 2022-07-21 | 41.0 | +-------------+-------+ 通过这次体验我们发现,Hive底层的确是通过MapReduce执行引擎来处理数据的执行完一个MapReduce程序需要的时间不短.如果是小数据集,使用hive进行分析将得不偿失,延迟很高.如果是大数据集,使用hive进行分析,底层MapReduce分布式计算,才能体现效果. |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |